package com.nowcoder.community.controller;

import com.alibaba.fastjson.JSONObject;
import com.nowcoder.community.dao.MessageMapper;
import com.nowcoder.community.entity.Message;
import com.nowcoder.community.entity.Page;
import com.nowcoder.community.entity.User;
import com.nowcoder.community.service.MessageService;
import com.nowcoder.community.service.UserService;
import com.nowcoder.community.util.CommunityConstant;
import com.nowcoder.community.util.CommunityUtil;
import com.nowcoder.community.util.HostHolder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.util.HtmlUtils;

import java.util.*;

/**
 * <p>Title: MessageController</p>
 * <p>author 12427</p>
 *
 * @version ver1.0
 * @date 2022/8/18 11:37
 */
@Controller
public class MessageController  implements CommunityConstant {

    @Autowired
    private MessageService messageService ;
    @Autowired
    private HostHolder hostHolder ;

    @Autowired
    private UserService userService ;

    // 私信列表请求
    @RequestMapping(path = "/letter/list" , method = RequestMethod.GET)
    public String getLetterList(Model model , Page page){
        User user = hostHolder.getUser();

        // 分页信息
        page.setPath("/letter/list");
        page.setLimit(5);
        page.setRows(messageService.findConversationCount(user.getId()));

        // 查询会话列表
        // 拿到的是每一个会话的最新消息
        List<Message> conversationList =
                messageService.findConversation(user.getId(), page.getOffset(), page.getLimit());

        List<Map<String , Object>>  conversations = new ArrayList<>() ;

        // 新建Map重构数据
        if(conversationList != null) {
            for(Message message : conversationList){
                Map<String , Object> map = new HashMap<>() ;
                map.put("conversation" , message) ;
                map.put("letterCount" , messageService.findLetterCount(user.getId() ,message.getConversationId())) ;
                map.put("unreadCount" , messageService.findLetterUnreadCount(user.getId() , message.getConversationId())) ;

                int targetId = user.getId() == message.getFromId() ? message.getToId() : message.getFromId() ;

                map.put("target" , userService.findUserById(targetId) ) ;

                conversations.add(map) ;

            }
        }
        model.addAttribute("conversations" ,conversations) ;

        // 查询未读消息数量
        int letterUnreadCount = messageService.findLetterUnreadCount(user.getId() , null) ;
        model.addAttribute("letterUnreadCount" , letterUnreadCount) ;

        // 查询未读通知数量
        int noticeUnreadCount = messageService.findNoticeUnreadCount(user.getId() , null) ;
        model.addAttribute("noticeUnreadCount" , noticeUnreadCount) ;

        return "/site/letter" ;

    }

    private List<Integer> getLetterIds(List<Message> letterList){
        List<Integer> ids = new ArrayList<>() ;

        if(letterList != null) {
            for(Message message : letterList) {
                if(hostHolder.getUser().getId() == message.getToId() && message.getStatus() == 0 ){
                    ids.add(message.getId()) ;
                }
            }
        }

        return  ids ;
    }

    @RequestMapping(path = "/letter/detail/{conversationId}" , method = RequestMethod.GET)
    public String getLetterDetail(@PathVariable("conversationId") String conversationId , Page page , Model model){

        User user = hostHolder.getUser() ;
        // 分页的信息
        page.setLimit(5);
        page.setPath("/letter/detail/" + conversationId) ;
        page.setRows(messageService.findLetterCount(user.getId() , conversationId));

        // 对话详情列表
        List<Message> letterList = messageService.findLetters(user.getId()  , conversationId, page.getOffset(), page.getLimit());

        List<Map<String,Object>> letters = new ArrayList<>() ;
        if(letterList != null) {
            for(Message message : letterList){
                Map<String,Object> map = new HashMap<>() ;

                map.put("letter" , message) ;

                // letter信息发送人
                map.put("fromUser" , userService.findUserById(message.getFromId())) ;
                letters.add(map) ;
            }
        }

        model.addAttribute("letters" , letters) ;

        // 私信的目标
        model.addAttribute("target" , getLetterTarget(conversationId)) ;

        // 设置成已读
        List<Integer> ids = getLetterIds(letterList) ;
        if(!ids.isEmpty()){
            messageService.readMessage(ids) ;
        }

        return "/site/letter-detail" ;

    }


    private User getLetterTarget (String ConversationId){
        String[] ids = ConversationId.split("_");
        int id0 = Integer.parseInt(ids[0]);
        int id1 = Integer.parseInt(ids[1]);
        if(hostHolder.getUser().getId() == id0){
            return userService.findUserById(id1) ;
        }else return userService.findUserById(id0) ;

    }

    @RequestMapping(path = "/letter/send" , method = RequestMethod.POST)
    @ResponseBody
    public String sendLetter(String toName , String content){
        User target = userService.findUserByName(toName);
        if(target == null){
            return CommunityUtil.getJSONString(1 , "目标用户不存在!") ;
        }

        Message message = new Message() ;
        message.setFromId(hostHolder.getUser().getId());
        message.setToId(target.getId());
        if(message.getFromId() < message.getToId()){
            message.setConversationId(message.getFromId() + "_" + message.getToId());
        }else {
            message.setConversationId(message.getToId() + "_" + message.getFromId());
        }

        message.setContent(content);
        message.setCreateTime(new Date());
        messageService.addMessage(message) ;
        return CommunityUtil.getJSONString(0) ;
    }


    @RequestMapping(path = "/letter/delete" , method = RequestMethod.POST)
    @ResponseBody
    public String deleteLetter(int id){

        Message message = messageService.findMessageById(id) ;


        User user = hostHolder.getUser() ;

        if(user == null){
            return CommunityUtil.getJSONString( 1 , "您还未登录") ;
        }

        if(message.getFromId() == user.getId()){
            // 作为发送人删除
            if(message.getStatus() == DELETED_BY_RECIPIENFT){
                // 已被接收人删除，归为双方都删除
                messageService.deleteLetterBoth(id) ;
            }else {
                // 仅发送人删除
                messageService.deleteLetterBySender(id);
            }
        }else{
            // 作为接收者删除
            if(message.getStatus() == DELETED_BY_SENDER){
                messageService.deleteLetterBoth(id) ;
            }else{
                messageService.deleteLetterByRecipient(id) ;
            }
        }

        return CommunityUtil.getJSONString(0) ;
    }

    @RequestMapping(path = "/notice/list" , method = RequestMethod.GET)
    public String getNoticeList(Model model){
       User user = hostHolder.getUser() ;

        // 查询评论类通知
        Message message = messageService.findLatestNotice(user.getId() , TOPIC_COMMENT) ;


        if(message != null ){
            Map<String , Object> messageVO = new HashMap<>() ;
            messageVO.put("message" , message) ;

            String content = HtmlUtils.htmlUnescape(message.getContent()) ;
            Map<String , Object> data = JSONObject.parseObject(content, HashMap.class);

            messageVO.put("user" , userService.findUserById((Integer) data.get("userId"))) ;
            messageVO.put("entityType" , data.get("entityType")) ;
            messageVO.put("entityId" , data.get("entityId")) ;
            messageVO.put("postId" , data.get("postId")) ;

            int count = messageService.findNoticeCount(user.getId() , TOPIC_COMMENT) ;
            messageVO.put("count" , count) ;

            int unread = messageService.findNoticeUnreadCount(user.getId() , TOPIC_COMMENT) ;
            messageVO.put("unread" , unread) ;

            model.addAttribute("commentNotice" , messageVO) ;
        }




        // 查询点赞通知
        message = messageService.findLatestNotice(user.getId() , TOPIC_LIKE) ;


        if(message != null ){
            Map<String , Object> messageVO = new HashMap<>() ;
            messageVO.put("message" , message) ;

            String content = HtmlUtils.htmlUnescape(message.getContent()) ;
            Map<String , Object> data = JSONObject.parseObject(content, HashMap.class);

            messageVO.put("user" , userService.findUserById((Integer) data.get("userId"))) ;
            messageVO.put("entityType" , data.get("entityType")) ;
            messageVO.put("entityId" , data.get("entityId")) ;
            messageVO.put("postId" , data.get("postId")) ;

            int count = messageService.findNoticeCount(user.getId() , TOPIC_LIKE) ;
            messageVO.put("count" , count) ;

            int unread = messageService.findNoticeUnreadCount(user.getId() , TOPIC_LIKE) ;
            messageVO.put("unread" , unread) ;
            model.addAttribute("likeNotice" , messageVO) ;
        }





        // 查询关注类的通知
        message = messageService.findLatestNotice(user.getId() , TOPIC_FOLLOW) ;


        if(message != null ){
            Map<String , Object> messageVO = new HashMap<>() ;
            messageVO.put("message" , message) ;

            String content = HtmlUtils.htmlUnescape(message.getContent()) ;
            Map<String , Object> data = JSONObject.parseObject(content, HashMap.class);

            messageVO.put("user" , userService.findUserById((Integer) data.get("userId"))) ;
            messageVO.put("entityType" , data.get("entityType")) ;
            messageVO.put("entityId" , data.get("entityId")) ;

            int count = messageService.findNoticeCount(user.getId() , TOPIC_FOLLOW) ;
            messageVO.put("count" , count) ;

            int unread = messageService.findNoticeUnreadCount(user.getId() , TOPIC_FOLLOW) ;
            messageVO.put("unread" , unread) ;

            model.addAttribute("followNotice" , messageVO) ;
        }


        // 查询未读消息数量
        int letterUnreadCount = messageService.findLetterUnreadCount(user.getId() , null) ;
        model.addAttribute("letterUnreadCount" , letterUnreadCount) ;

        // 查询未读通知数量
        int noticeUnreadCount = messageService.findNoticeUnreadCount(user.getId() , null) ;
        model.addAttribute("noticeUnreadCount" , noticeUnreadCount) ;

        return "/site/notice" ;
    }


    @RequestMapping(path = "/notice/detail/{topic}"  ,method = RequestMethod.GET)
    public String getNoticeDetail(@PathVariable("topic") String topic ,  Page page , Model model) {
        User user = hostHolder.getUser() ;
        page.setLimit(5);
        page.setRows(messageService.findNoticeCount(user.getId() , topic));
        page.setPath("/notice/detail/" + topic);

        List<Message> noticeList = messageService.findNotice(user.getId() , topic , page.getOffset() , page.getLimit()) ;
        List<Map<String,Object>> noticeVoList= new ArrayList<>() ;

        if(noticeList != null){
            for(Message notice : noticeList) {
                Map<String,Object> map = new HashMap<>() ;
                map.put("notice" , notice) ;
                // 内容
                String content = HtmlUtils.htmlUnescape(notice.getContent()) ;
                Map<String, Object> data = JSONObject.parseObject(content, HashMap.class);
                map.put("user" , userService.findUserById((Integer) data.get("userId"))) ;
                map.put("entityType" , data.get("entityType")) ;
                map.put("entityId" , data.get("entityId")) ;
                map.put("postId" , data.get("postId")) ;

                // 通知的作者
                map.put("fromUser" , userService.findUserById(notice.getFromId()));

                noticeVoList.add(map) ;
            }

        }

        model.addAttribute("notices" , noticeVoList) ;

        // 每打开新的一页，将当前页设置已读
        List<Integer> ids = getLetterIds(noticeList) ;
        if(!ids.isEmpty()){
            messageService.readMessage(ids) ;
        }

        return "/site/notice-detail" ;
    }



}
